package projeto.model;

import java.util.List;
/**
 * 
 * @author Javatar
 * Classe usada para criar objetos do tipo Usuário, nela guardamos informações sobre
 * cada usuário do sistema ( nome, data de uso, opiniões, etc...).
 */

public class Usuario {
	
	private static int contAnonimo = 1;
	private String data;
	private String nome;
	private List<Integer> opinioes ;
	
	/**
	 * Construtor para criar um objeto do tipo Usuario, onde serão salvos todas as informações do Objeto Usuario,
	 * como nome, data/hora, opiniões
	 * @param data - Data/hora no qual o usuario deu sua opinião(String);
	 * @param nome - Nome do usuario que deu a opinião(String);
	 * @param opinioes - Lista de opinições do usuario com relação aos estabelecimentos(List<String>)
	 * @throws Exception - Casos de exceções para o Usuário, envolvendo nome inválido,data inválida e Lista de opiniões inválida(Exception);
	 */
	
	public Usuario(String data, String nome, List<Integer> opinioes)throws Exception{
		setData(data);
		setNome(nome);
		setOpinioes(opinioes);
	}
	/**
	 * Método que retorna o nome do Usuário;
	 * @return nome - String na qual é referente ao nome do Usuário instanciado;
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * Método que retorna a Data/hora no qual o usuário deu sua opinião;
	 * @return data - String que contém a informação de data/hora na qual o usuário deu sua opinião;
	 */
	public String getData(){
		return data;
	}
	
	/**
	 * Método que retorna uma Lista de String contendo todas as opiniões do usuário referente;
	 * @return opnioes - List<String> que contém as opiniões do usuário referente;
	 */
	public List<Integer> getOpnioes(){
		return opinioes;
	}
	
	/**
	 * Método que seta um nome para o usuario referente, podendo mudar o nome do usuario
	 * e também é utilizado no construtor, para criar o nome do usuario;
	 * @param nome - String referente ao nome que será setado no usuário;
	 * @throws Exception - Exceção que pode ser lançada quando nome for null ou vazio;
	 */
	public void setNome(String nome) throws Exception {
		if(nome == null)
			throw new Exception("Nome Nulo.");
		
		if(nome.trim().equals(""))
			nome = "Anonimo " + Integer.toString(contAnonimo++);
		
		this.nome = nome;
	}
	/**
	 * Método que seta a data na qual o usuário deu suas opiniões, esse método só pode ser utilizado no construtor da classe;
	 * @param data - String contendo a data na qual o usuário deu suas opiniões;
	 * @throws Exception - Exceção que pode ser lançada quando data for null ou vazio;
	 */
	public void setData(String data)throws Exception{
		if(data == null)
			throw new Exception("Data Nula.");
		
		if(data.trim().equals(""))
			throw new Exception("Data vazia.");
		
		this.data = data;
		
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result
				+ ((opinioes == null) ? 0 : opinioes.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (opinioes == null) {
			if (other.opinioes != null)
				return false;
		} else if (!opinioes.equals(other.opinioes))
			return false;
		return true;
	}
	/**
	 * Método que seta uma Lista de opiniões referente as opiniões do usuário;
	 * @param opinioes - List<Integer> contendo as opiniões do usuário;
	 * @throws Exception - Exceção que pode ser lançada quando opiniao for null ou tiver tamanho menor que 39;
	 */
	public void setOpinioes(List<Integer> opinioes)throws Exception{
		if(opinioes == null)
			throw new Exception("Opnioes Nulas");

		this.opinioes = opinioes;
		
	}
	
	/**
	 * Método toString que retorna uma representação textual do Objeto da seguinte forma:
	 * "Data de cadastro: " + data + " Nome: " + nome + " Opnioes " + opnioes;
	 * 
	 */
	@Override
	public String toString(){
		return data+";"+nome+";"+opinioes.toString().substring(1,(opinioes.toString().length()-1)).replace(", ",";");
	}
}
